package com.cskaoyan.javase.oop1._6constructor._3assignment;

/**
 * 构造器的赋值
 * 构造器定义完毕后，我们就可以使用了，这时我们发现构造器就可以完成：
 *      类似于对象"出厂"就设置好属性值的作用。
 * 我们在new后面写什么参数，属性值就能够对应赋值。这是因为：
 *
 * (非常重要)在new对象过程中,存在各式各样手动(程序员写代码)给成员变量赋值的方式
 *      其中构造器赋值是最后执行的！！！
 *      所以我经常说"你可以永远相信构造器"(前提是标准格式构造器)
 *
 *
 * 总结,目前为止,在new对象过程中,所有给成员变量赋值的手段:
 *      1.显式赋值
 *      2.默认初始化赋值
 *      3.构造器赋值
 * 以上三种赋值方式,遵循"掐头去尾"的原则
 *      头: 默认初始化,具有默认值,永远最先执行.
 *      在创建对象时,JVM在内存中构建出对象的内存结构后
 *      会"顺手"给成员变量赋默认值,其他的任何赋值手动都会在默认值之后进行.
 *
 *      尾: 构造器赋值,永远最后执行
 *
 * 剩下的,显式赋值,就只能在中间执行了.'
 *
 * 使用idea的debug模式,追踪new对象过程中,成员变量的赋值顺序
 * 在idea当中,进入new对象过程中,可以看到构造器的执行过程
 * 表现为: <init>类名 方法栈帧进栈
 *
 * @since 10:44
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*
            new对象过程中,num的取值变化
            0 --> 100 --> 666
         */
        A a = new A(666);
        System.out.println(a.num);
    }
}

class A{
    // 显式赋值
    int num = 100;

    public A(int num) {
        // 构造器赋值
        this.num = num;
    }
}
